import { ClientMsgOff, ClientMsgOn, CreateEventKey, EventCode } from "../events/ClientMsgHandle";
import { post, registerMttq } from "../utils/Client";

/**消息队列 */
class Mttq {
  constructor() {}

  /**
   * 获取订阅的消息主题
   * @param {*} topics 如果无特殊要求，这里发送0就行
   * @returns Promise<any>
   */
  static getSubTopics(topics = 0) {
    return post("mqtt_topics", { topics });
  }

  /**
   * 取消订阅
   * @param {*} topic 需要取消订阅的主题名
   */
  static unSubscribe(topic) {
    return post("mqtt_unSubscribe", { topic });
  }

  /**
   * 订阅消息
   * @param {*} topic 订阅的主题名
   * @param {*} qos 协议  0：至多一次   1：至少一次  2：确保只有一次 说明：
    qos0：Sender 发送的一条消息，Receiver 最多能收到一次
    qos1：Sender 发送的一条消息，Receiver 至少能收到一次
    qos2：Sender 发送的一条消息，Receiver 确保能收到而且只收到一次
   */
  static subscribe(topic, qos = 0) {
    return post("mqtt_subscribe", { topic, qos });
  }

  /**
   * 发布消息
   * @param {*} topic 订阅的主题名
   * @param {*} message 发送的消息内容，字符串类型，一般都是json转为字符串
   * @param {*} qos 协议(和订阅保持一致)  0：至多一次   1：至少一次  2：确保只有一次
   */
  static push(topic, message, qos = 0) {
    return post("mqtt_publish", { topic, qos, message });
  }
  /**
   * 删除主题消息处理函数
   * @param topic
   */
  static off(topic) {
    Mttq.unSubscribe(topic).then((result) => {
      console.log("mttq unsubscribe", topic, result);
    });
    const eventKey = CreateEventKey(EventCode.MTTQ, topic);
    ClientMsgOff(eventKey);
  }

  /**
   * 注册MTTQ主题消息处理函数
   * @param {*} topic 主题
   * @param {*} call
   */
  static on(topic, call) {
    Mttq.subscribe(topic, 0).then((result) => {
      const eventKey = CreateEventKey(EventCode.MTTQ, topic);
      ClientMsgOn(eventKey, call);
    });
  }
}

export { Mttq };
